<?

/**
 * Eventos class
 *
 * Esta clase maneja los eventos de CasamientosOnline
 * @author Alejandro Garcia del Rio <alejandro.garciadelrio@gmail.com>
 * @version 1.0
 * @package Eventos
*/
class Eventos extends Core {

	static protected $instancia;
	static protected $opciones = array(
		'filtros' => array(
			'estado = 1',
		),
		'rpp' => 1000, // Resultados por pagina 
		'page' => 1, // Numero de pagina por defecto
		'order' => array('t1.nombre', 'ASC') // Ordenamiento de listar() con el tipo de ordenamiento (opcional)
	);
	protected $count = 0;
	protected $paginas = 0;
	private $id_tipo = null;
	private $tabla;

	/**
	 * Constructor de la clase.
	 * 
	 * @param integer $id_tipo (opcional) El id del tipo de evento que se quiere instanciar
	 * @param array $opciones (opcional) Opciones validas para esta clase
	 */
	function __construct ($id_tipo=null, $opciones=null) {
		// Llamo al constructor del parent tambien
		parent::__construct();
		// Guardo las opciones si me definio alguna
		if ($opciones)
			$this->opciones($opciones);
		// Seteo el id de evento
		$this->tipo($id_tipo_evento);
	}

	/**
	 * Devuelve una unica instancia de esta clase
	 * 
	 * @return object Instancia de esta clase
	 */
	public static function getInstance() {
		if (!self::$instancia instanceof self)
			self::$instancia = new self;
		return self::$instancia;
	}

	/**
	 * Setea las opciones 
	 * 
	 * @param array $opciones (opcional) Opciones validas para esta clase. Si esta vacio, funciona como un getter.
	 * @return array $opciones Listado de opciones
	 */
	public function opciones ($opciones=null) {
		return self::$opciones = parent::opciones(self::$opciones, $opciones);
	}

	/**
	 * Devuelve la tabla de este tipo de evento
	 * 
	 * @return object Instancia de esta clase
	 */
	public static function tabla () {
		return $this->tabla;
	}

	/**
	 * Setea el tipo de evento para la instancia
	 * 
	 * @param integer $id_tipo (opcional) El id del tipo de evento. Si no esta definido, el metodo funciona como un getter
	 * @return integer El id de este tipo de evento
	 */
	public function tipo ($id_tipo=null) {
		if ($id_tipo) {
			$this->id_tipo = addslashes($id_tipo);
			// Obtengo el objeto de base de datos
			$db = ($this)? $this->db : ez_sql::getInstance();
			// Almaceno tambien la tabla de este tipo de evento
			$this->tabla = $db->get_var("SELECT tabla FROM evn_tipos WHERE id = '$id_tipo'");
		}
		
		return $this->id_tipo;
	}

	/**
	 * Devuelve los estados de este tipo de evento, ya sea los intermedios (que dependen de 
	 * un estado principal) como los principales
	 * 
	 * @param integer $id_estado (opcional) El id de estado padre al que pertenecen los estados. Si no esta definido devuelve todos los estados parent
	 * @return array
	 */
	public function estados ($id_estado=0) {

		// Saneamiento de variables
		$id_estado = addslashes($id_estado);
		
		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo los estados
		$estados = $db->get_results("SELECT * FROM evn_estados ee WHERE ee.padre = '$id_estado'");

		return $estados;
	}
	
	/**
	 * Devuelve la informacion de un estado
	 * 
	 * @param integer $id_estado El id de estado que se quiere obtener
	 * @return array
	 */
	public function estado ($id_estado) {

		// Saneamiento de variables
		$id_estado = addslashes($id_estado);
		
		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo los estados
		$estado = $db->get_row("SELECT * FROM evn_estados ee WHERE ee.id = '$id_estado'");

		return $estado;
	}
	
	/**
	 * Devuelve los origenes posibles para cualquier evento
	 * 
	 * @return array
	 */
	public function origenes () {

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo los estados
		$origenes = $db->get_results("SELECT * FROM evn_origenes eo WHERE 1=1 ORDER BY origen");

		return $origenes;
	}
	
	/**
	 * Devuelve todos los estados y los estados intermedios de un evento, 
	 * con la cantidad de invitados en cada uno 
	 * 
	 * @param integer $id_evento (Opcional) El id del evento del que se quieren sus estados e invitados. Si no esta definido, es obligatorio
	 * que se haya especificado el tipo de evento mediante Eventos::tipo()
	 * @return array
	 */
	public function estados_all ($id_evento=0) {

		// Saneamiento de variables
		$id_evento = addslashes($id_evento);
		
		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo la tabla de invitados de este tipo de evento
		if (!($tabla = $db->get_var("SELECT et.tabla FROM evn_tipos et, evn_eventos ee WHERE et.id = ee.id_tipo AND ee.id = $id_evento")))
			$tabla = $db->get_var("SELECT et.tabla FROM evn_tipos et WHERE et.id = ".$this->tipo());

		// Si no me definio el evento (para conocer la cantidad de invitados por estado) me tiene que definir el tipo de evento
		if ($id_evento)
			$and = " AND ev.id = '$id_evento' ";
		else if ($id_tipo = $this->tipo())
			$and = " AND ee.id_tipo = '".$this->tipo()."' ";
		else
			return $this->fail('No hay un evento ni un tipo de evento definido');

		// Obtengo los estados
		$estados = array();
		$query = "SELECT ee.*, COUNT(t1.id) cant
				FROM evn_eventos ev, evn_estados ee
				LEFT JOIN $tabla t1 ON ee.id = t1.estado and t1.id_evento = '$id_evento'
				WHERE ee.id_tipo = ev.id_tipo
				$and
				GROUP BY ee.id
				ORDER BY ee.padre, ee.orden, ee.estado";
		if ($_estados = $db->get_results($query))
			foreach ($_estados as $estado)
				($estado['padre'])? $estados[$estado['padre']]['hijos'][$estado['id']] = $estado : $estados[$estado['id']] = $estado;

		return $estados;
	}
	
	/**
	 * Devuelve los tipos de evento
	 * 
	 * @param integer $id_tipo (Opional) El id del tipo de evento del que se quiere la informacion. Si no esta definido, devuelve todos
	 * @return array
	 */
	public function tipos ($id_tipo_evento=null) {

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo los estados
		$tipos = ($id_tipo_evento)?  $db->get_row("SELECT * FROM evn_tipos et WHERE id = '$id_tipo_evento'") : $db->get_results("SELECT * FROM evn_tipos et WHERE 1=1");

		return $tipos;
	}

	/**
	 * Devuelve los eventos del tipo de evento solicitado
	 * 
	 * @param integer $id_tipo El id del tipo de evento del que se quieren los eventos
	 * @param array $opciones (opcional) Opciones validas para esta clase
	 * @return array
	 */
	public function eventos ($id_tipo=null, $opciones=null) {

		// Saneamiento de variables
		$id_tipo = addslashes($id_tipo);
		
		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Seteo el tipo de evento
		if (!($id_tipo = ($this->tipo($id_tipo))))
			return $this->fail('No hay un tipo de evento definido');

		// Seteo/obtengo las opciones
		$opciones = self::opciones($opciones);

		// Armo los filtros
		$and = '';
		if ($opciones['filtros'])
			$and = 'AND '.implode(' AND ', $opciones['filtros']);

		// Obtengo los eventos
		$eventos = $db->get_results("SELECT * FROM evn_eventos ee WHERE 1=1 $and AND ee.id_tipo = '$id_tipo'");

		return $eventos;
	}

	/**
	 * Devuelve la informacion de un evento
	 * 
	 * @param integer $id_evento El id del evento
	 * @return array 
	 */
	public function get ($id_evento) {

		// Saneamiento de variables
		$id_evento = addslashes($id_evento);
		
		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo el registro del template
		$evento = $db->get_row("SELECT * FROM evn_eventos ee WHERE ee.id = '$id_evento'");

		return $evento;
	}

	/**
	 * Guarda los cambios a un evento. 
	 * 
	 * @param array $campos Los campos a almacenar. Si recibe id_evento, modifica sino agrega
	 * @return integer El id de registro insertado o actualizado
	 */
	public function save ($campos) {

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Me fijo si tengo que actualizarlo o insertarlo
		$id = $campos['id'];
		if ($id)
			$db->update('evn_eventos', $campos);
		else
			$id = $db->insert('evn_eventos', $campos);

		// Si no quedan eventos activos, creo uno
		if ($campos['id_tipo'] && !$db->get_var("SELECT id FROM evn_eventos WHERE id_tipo = '".$campos['id_tipo']."'")) {
			$nuevo_id = $db->insert('evn_eventos', array(
				'evento' 	=> '', 
				'id_tipo' 	=> $campos['id_tipo'], 
				'estado' 	=> 1, 
				'fecha' 	=> date("Y-m-d")
			));
			$db->update('evn_eventos', array('id' => $nuevo_id, 'evento' => 'Evento automatico '.$nuevo_id));
		}

		return $id;
	}

	/**
	 * Guarda los cambios a un estado
	 * 
	 * @param array $campos Los campos a almacenar. Si recibe id_evento, modifica sino agrega
	 * @return integer El id de registro insertado o actualizado
	 */
	public function estado_save ($campos) {

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Me fijo si tengo que actualizarlo o insertarlo
		$id = $campos['id'];
		if ($id)
			$db->update('evn_estados', $campos);
		else
			$id = $db->insert('evn_estados', $campos);

		return $id;
	}

	/**
	 * Devuelve el reporte de asistentes y confirmados de un tipo de evento, agrupado por evento
	 * 
	 * @param integer $id_tipo El id del tipo de evento
	 * @return array
	 */
	public function reporte_asistentes ($id_tipo) {

		// Saneamiento de variables
		$id_tipo = addslashes($id_tipo);

		// Seteo el tipo de evento
		$this->tipo($id_tipo);
		
		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		$query = "SELECT ee.id, ee.fecha, ee.evento, ee.asistentes, IFNULL(COUNT(t1.id), 0) confirmados
				FROM evn_eventos ee
				LEFT JOIN ".$this->tabla." t1 ON ee.id = t1.id_evento
				WHERE ee.id_tipo = $id_tipo
				GROUP BY ee.id
				ORDER BY ee.fecha ASC";
		$reporte = $db->get_results($query);

		return $reporte;
	}

	/**
	 * Devuelve los rubros (esto deberia estar en su clase correspondiente)
	 * 
	 * @return array
	 */
	public function rubros () {

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo los rubros
		$rubros = $db->get_results("SELECT * FROM prov_rubros WHERE 1=1 ORDER BY id_sucursal, rubro");

		return $rubros;
	}

	/**
	 * Devuelve las provincias (esto deberia estar en su clase correspondiente)
	 * 
	 * @return array
	 */
	public function provincias () {

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo los provincias
		if ($_provincias = $db->get_results("SELECT * FROM sys_provincias WHERE 1=1 AND estado > 1 ORDER BY orden, provincia"))
			foreach ($_provincias as $prov)
				$provincias[$prov['id']] = $prov['provincia'];

		return $provincias;
	}

	/**
	 * Devuelve las localidades de una provincia (esto deberia estar en su clase correspondiente)
	 * 
	 * @param integer $id_provincia El id de la provincia del que se quieren las localidades
	 * @return array
	 */
	public function localidades ($id_provincia) {

		// Saneamiento de variables
		$id_provincia = addslashes($id_provincia);

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo los localidades
		if ($_localidades = $db->get_results("SELECT * FROM sys_localidades WHERE 1=1 AND id_provincia = '$id_provincia' AND estado > 1 ORDER BY localidad"))
			foreach ($_localidades as $loc)
				$localidades[$loc['id']] = $loc;

		return $localidades;
	}


	/**
	 * Devuelve las localidades (esto deberia estar en su clase correspondiente)
	 * 
	 * @param integer $id_localidad El id de la localidad que se quieren
	 * @return array
	 */
	public function localidad ($id_localidad) {

		// Saneamiento de variables
		$id_localidad = addslashes($id_localidad);

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo los localidades
		$localidad = $db->get_row("SELECT * FROM sys_localidades WHERE 1=1 AND id = '$id_localidad'");

		return $localidad;
	}

}

?>
